package main

import "container/list"

type Key interface{}

type entry struct {
	key   Key
	value interface{}
}

type Cache struct {
	MaxEntries int
	// 触发淘汰时调用
	OnEvicted func(key Key, value interface{})
	// 链表
	ll    *list.List
	cache map[interface{}]*list.Element
}

// 创建缓存
func New(maxEntries int) *Cache {
	return &Cache{
		MaxEntries: maxEntries,
		ll:         list.New(),
		cache:      make(map[interface{}]*list.Element),
	}
}

// 向缓存中添加数据，如果缓存已满则将最久未使用的对象删除
func (c *Cache) Add(key Key, value interface{}) {
	if c.cache == nil {
		c.cache = make(map[interface{}]*list.Element)
		c.ll = list.New()
	}
	// 查看缓存中是否已经有了该值
	if ee, ok := c.cache[key]; ok {
		// 如果存在，则将其移到头部
		c.ll.MoveToFront(ee)
		ee.Value.(*entry).value = value
		return
	}
	// 如果不存在，则将其添加到缓存中
	ele := c.ll.PushFront(&entry{key, value})
	c.cache[key] = ele
}

func main() {

}
